function pickExclude(obj, keys) {
    // 某些情况下，type可能会为
    if (!['[object Object]', '[object File]'].includes(Object.prototype.toString.call(obj))) {
        return {}
    }
    return Object.keys(obj).reduce((prev, key) => {
        if (!keys.includes(key)) {
            prev[key] = obj[key]
        }
        return prev
    }, {})
}

function formatImage(res) {
    return res.tempFiles.map((item) => ({
        ...pickExclude(item, ['path']),
        type: 'image',
        url: item.path,
        thumb: item.path,
        size: item.size,
        // #ifdef H5
        name: item.name
        // #endif
    }))
}

function formatVideo(res) {
    return [
        {
            ...pickExclude(res, ['tempFilePath', 'thumbTempFilePath', 'errMsg']),
            type: 'video',
            url: res.tempFilePath,
            thumb: res.thumbTempFilePath,
            size: res.size,
            // #ifdef H5
            name: res.name
            // #endif
        }
    ]
}

function formatMedia(res) {
    return res.tempFiles.map((item) => ({
        ...pickExclude(item, ['fileType', 'thumbTempFilePath', 'tempFilePath']),
        type: res.type,
        url: item.tempFilePath,
        thumb: res.type === 'video' ? item.thumbTempFilePath : item.tempFilePath,
        size: item.size
    }))
}

function formatFile(res) {
    return res.tempFiles.map((item) => ({
        ...pickExclude(item, ['path']),
        url: item.path,
        size: item.size,
        // #ifdef H5
        name: item.name,
        type: item.type
        // #endif 
    }))
}
export function chooseFile({
    accept,
    multiple,
    capture,
    compressed,
    maxDuration,
    sizeType,
    camera,
    maxCount
}) {
    return new Promise((resolve, reject) => {
        switch (accept) {
            case 'image':
                uni.chooseImage({
                    count: multiple ? Math.min(maxCount, 9) : 1,
                    sourceType: capture,
                    sizeType,
                    success: (res) => resolve(formatImage(res)),
                    fail: reject
                })
                break
            // #ifdef MP-WEIXIN
            // 只有微信小程序才支持chooseMedia接口
            case 'media':
                wx.chooseMedia({
                    count: multiple ? Math.min(maxCount, 9) : 1,
                    sourceType: capture,
                    maxDuration,
                    sizeType,
                    camera,
                    success: (res) => resolve(formatMedia(res)),
                    fail: reject
                })
                break
            // #endif
            case 'video':
                uni.chooseVideo({
                    sourceType: capture,
                    compressed,
                    maxDuration,
                    camera,
                    success: (res) => resolve(formatVideo(res)),
                    fail: reject
                })
                break
            // #ifdef MP-WEIXIN || H5
            // 只有微信小程序才支持chooseMessageFile接口
            case 'file':
                // #ifdef MP-WEIXIN
                wx.chooseMessageFile({
                    count: multiple ? maxCount : 1,
                    type: accept,
                    success: (res) => resolve(formatFile(res)),
                    fail: reject
                })
                // #endif
                // #ifdef H5
                // 需要hx2.9.9以上才支持uni.chooseFile
                uni.chooseFile({
                    count: multiple ? maxCount : 1,
                    type: accept,
                    success: (res) => resolve(formatFile(res)),
                    fail: reject
                })
                // #endif
                break
            // #endif
            default:
                // 此为保底选项，在accept不为上面任意一项的时候选取全部文件
                // #ifdef MP-WEIXIN
                wx.chooseMessageFile({
                    count: multiple ? maxCount : 1,
                    type: 'all',
                    success: (res) => resolve(formatFile(res)),
                    fail: reject
                })
                // #endif
                // #ifdef H5
                // 需要hx2.9.9以上才支持uni.chooseFile
                uni.chooseFile({
                    count: multiple ? maxCount : 1,
                    type: 'all',
                    success: (res) => resolve(formatFile(res)),
                    fail: reject
                })
            // #endif
        }
    })
}
